#pragma once

#include <QXmlDefaultHandler>
#include "typedefs.h"
#include "DraftFwd.h"


class XMLHandler : public QXmlDefaultHandler
{
public:
    XMLHandler(DraftPtr draft);

public:
    QString GetError();

public:
    virtual bool startDocument();
    virtual bool endDocument();

    virtual bool startElement(const QString& namespaceURI, 
                              const QString& localName,
                              const QString& qName, 
                              const QXmlAttributes& attributes);

    virtual bool endElement(const QString& namespaceURI, 
                            const QString& localName,
                            const QString& qName);

    virtual bool characters(const QString& str);

    virtual bool fatalError(const QXmlParseException& exception);

private:
    bool CheckParent(const QString& tag, const QString& parent);
    bool CheckAttrs(const QString& tag, const StringSet& attrPairs);

private:
    bool OnQualifier(const QString& parent, const QString& tag, const QXmlAttributes& attributes);

private:
    bool SetError(const QString& error);

private:
    void CreateParentsDict();
    void CreateAttrsDict();

private:
    QString             _errorString;
    DraftPtr            _draft;
    StringStack         _tags;
    StringMap           _parentsDict;
    StringSetMultiMap   _attrsDict;
};